home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xarchie-2.0.9 / m-settings.c < prev    next >
C/C++ Source or Header  |  1995-06-18  |  13KB  |  505 lines

  1. /*
  2.  * m-settings.c : Settings menu routines
  3.  *
  4.  * George Ferguson, ferguson@cs.rochester.edu, 23 Apr 1993.
  5.  */
  6.  
  7. #include <X11/Intrinsic.h>
  8. #include <X11/Xaw/SimpleMenu.h>
  9. #include <X11/Xaw/SmeBSB.h>
  10. #include <X11/StringDefs.h>
  11. #include <X11/IntrinsicP.h>    /* Need rectangle part of SmeBSBObject */
  12. #include <X11/Xaw/SmeBSBP.h>    /* See below, popupSubmenuAction()     */
  13. #include "stringdefs.h"
  14. #include "menu.h"
  15. #include "xarchie.h"
  16. #include "types.h"
  17. #include "appres.h"
  18. #include "browser.h"
  19. #include "settings.h"
  20. #include "status.h"
  21.  
  22. /*
  23.  * Functions defined here:
  24.  */
  25. void initSettingsMenu();
  26. void updateSettingsMenuMarks();
  27. void setHostMenuMark(),setSearchMenuMark(),setSortMenuMark(),setNiceMenuMark();
  28.  
  29. static void settingsSubmenuAction();
  30. static void settingsMenuCallback();
  31. static void hostMenuCallback(),searchMenuCallback();
  32. static void sortMenuCallback(),niceMenuCallback();
  33. static void setHostMenuCallback(),setSearchMenuCallback();
  34. static void setSortMenuCallback(),setNiceMenuCallback();
  35. static void setAutoScrollMenuCallback();
  36. static void ftpTypeMenuCallback(),ftpPromptMenuCallback();
  37. static void ftpTraceMenuCallback(),ftpStripMenuCallback();
  38.  
  39. /*
  40.  * Data defined here:
  41.  */
  42. static Widget settingsMenu;
  43. static Widget hostMenu,searchMenu,sortMenu,niceMenu;
  44. static Widget setHostMenu,setSearchMenu,setSortMenu,setNiceMenu;
  45. static Widget setAutoScrollMenu;
  46. static Widget ftpTypeMenu,ftpPromptMenu,ftpTraceMenu,ftpStripMenu;
  47. static SmeBSBObject settingsMenuItems[5];
  48. static SmeBSBObject *hostMenuItems,searchMenuItems[7];
  49. static SmeBSBObject sortMenuItems[3],niceMenuItems[6];
  50.  
  51. static SearchType searchValues[] = {
  52.     GfExact, GfSubstr, GfSubcase, GfRegexp,
  53.     GfExactSubstr, GfExactSubcase, GfExactRegexp
  54. };
  55. static SortType sortValues[] = {
  56.     GfName, GfDate, GfWeight
  57. };
  58. static int niceValues[] = {
  59.  /* Default, Nice, Nicer, Very Nice, Extremely Nice, Nicest */
  60.     0,       500,  1000,  5000,      10000,          32765
  61. };
  62. static Boolean autoScrollValues[] = {
  63.     True, False
  64. };
  65.  
  66. static char *ftpTypeValues[] = {
  67.     "binary", "ascii"
  68. };
  69. static Boolean ftpPromptValues[] = {
  70.     True, False
  71. };
  72. static Boolean ftpTraceValues[] = {
  73.     True, False
  74. };
  75. static Boolean ftpStripValues[] = {
  76.     True, False
  77. };
  78.  
  79. static XtActionsRec actionTable[] = {
  80.     { "settings-submenu",        settingsSubmenuAction },
  81. };
  82.  
  83. /*    -    -    -    -    -    -    -    -    */
  84.  
  85. void
  86. initSettingsMenu()
  87. {
  88.     /* Add action for popup submenus */
  89.     XtAppAddActions(appContext,actionTable,XtNumber(actionTable));
  90.     /* This is the main Settings menu */
  91.     settingsMenu = createMenu("settingsMenu","settingsMenuItem",5,
  92.                   settingsMenuItems,settingsMenuCallback);
  93.     /* Special case for hostMenu so it's easy to change */
  94.     hostMenuItems = (SmeBSBObject *)XtCalloc(appResources.numHosts,
  95.                          sizeof(SmeBSBObject));
  96.     hostMenu = createMenu("hostMenu","hostMenuItem",
  97.               appResources.numHosts,hostMenuItems,
  98.               hostMenuCallback);
  99.     setHostMenu = createMenu("setHostMenu","hostMenuItem",
  100.                  appResources.numHosts,NULL,
  101.                  setHostMenuCallback);
  102.     /* These are submenus of the Settings menu */
  103.     searchMenu = createMenu("searchMenu","searchMenuItem",7,searchMenuItems,
  104.                 searchMenuCallback);
  105.     sortMenu = createMenu("sortMenu","sortMenuItem",3,sortMenuItems,
  106.               sortMenuCallback);
  107.     niceMenu = createMenu("niceMenu","niceMenuItem",6,niceMenuItems,
  108.               niceMenuCallback);
  109.     /* These are for the settings panel (same labels, different callbacks) */
  110.     setSearchMenu = createMenu("setSearchMenu","searchMenuItem",7,NULL,
  111.                    setSearchMenuCallback);
  112.     setSortMenu = createMenu("setSortMenu","sortMenuItem",3,NULL,
  113.                  setSortMenuCallback);
  114.     setNiceMenu = createMenu("setNiceMenu","niceMenuItem",6,NULL,
  115.                  setNiceMenuCallback);
  116.     setAutoScrollMenu = createMenu("setAutoScrollMenu","setAutoScrollMenuItem",
  117.                    2,NULL,setAutoScrollMenuCallback);
  118.     ftpTypeMenu = createMenu("ftpTypeMenu","ftpTypeMenuItem",2,
  119.                  NULL,ftpTypeMenuCallback);
  120.     ftpPromptMenu = createMenu("ftpPromptMenu","ftpPromptMenuItem",2,
  121.                    NULL,ftpPromptMenuCallback);
  122.     ftpTraceMenu = createMenu("ftpTraceMenu","ftpTraceMenuItem",2,
  123.                    NULL,ftpTraceMenuCallback);
  124.     ftpStripMenu = createMenu("ftpStripMenu","ftpStripMenuItem",2,
  125.                    NULL,ftpStripMenuCallback);
  126.     /* Initialize the menu marks */
  127.     updateSettingsMenuMarks();
  128. }
  129.  
  130. /*    -    -    -    -    -    -    -    -    */
  131. /* Action procedures */
  132.  
  133. /*
  134.  * This function expects to be called from a BtnMotion event in the
  135.  * settingsMenu ONLY. It looks after popping up the submenus, but only
  136.  * if we've pulled right at least a bit.
  137.  */
  138. /*ARGSUSED*/
  139. static void
  140. settingsSubmenuAction(widget,event,params,num_params)
  141. Widget widget;
  142. XEvent *event;
  143. String *params;
  144. Cardinal *num_params;
  145. {
  146.     Arg args[2];
  147.     Widget parent,popup;
  148.     Window root,child;
  149.     int x,y,cx,cy,item,item_y;
  150.     Dimension w,h,item_h;
  151.     unsigned int buttons;
  152.  
  153.     /* Where'd the event occur? */
  154.     x = event->xmotion.x;
  155.     y = event->xmotion.y;
  156.     /* Check that it's in the menu */
  157.     XtSetArg(args[0],XtNwidth,&w);
  158.     XtSetArg(args[1],XtNheight,&h);
  159.     XtGetValues(widget,args,2);
  160.     if (x < 0 || x >= (int)w || y < 0 || y >= (int)h)
  161.         return;
  162.     /* Check that we've pulled right */
  163.     if (x < (int)w/2)
  164.     return;
  165.     /* It is, figure out which item it's in */
  166.     for (item=0; item < 4; item++) {
  167.     /* Can't do GetValues on XtNy, for some reason. Oh well. */
  168.     /* This is why we need those private header files above. */
  169.     item_y = settingsMenuItems[item]->rectangle.y;
  170.     item_h = settingsMenuItems[item]->rectangle.height;
  171.     if (item_y < y && item_y + (int)item_h > y)
  172.         break;
  173.     }
  174.     /* Some items have popups, some don't */
  175.     switch (item) {
  176.     case 0: popup = hostMenu;
  177.         break;
  178.     case 1: popup = searchMenu;
  179.         break;
  180.     case 2: popup = sortMenu;
  181.         break;
  182.     case 3: popup = niceMenu;
  183.         break;
  184.     default: return;
  185.     }
  186.     parent = XtParent(widget);
  187.     XQueryPointer(display,XtWindow(parent),
  188.           &root,&child,&x,&y,&cx,&cy,&buttons);
  189.     /* Put the mouse solidly in the window */
  190.     x -= 20;
  191.     y -= 20;
  192.     /* Position the menu */
  193.     XtSetArg(args[0],XtNx,x);
  194.     XtSetArg(args[1],XtNy,y);
  195.     XtSetValues(popup,args,2);
  196.     /* Pop it up */
  197.     XtPopup(popup,XtGrabExclusive);
  198. }
  199.  
  200. /*    -    -    -    -    -    -    -    -    */
  201. /* Callback procedures */
  202.  
  203. /*ARGSUSED*/
  204. static void
  205. settingsMenuCallback(w,client_data,call_data)
  206. Widget w;
  207. XtPointer client_data;    /* item */
  208. XtPointer call_data;    /* ignored */
  209. {
  210.     int item = (int)client_data;
  211.  
  212.     switch (item) {
  213.     case 0: /* Archie Host */
  214.     case 1: /* Search Type */
  215.     case 2: /* Sort Type */
  216.     case 3: /* Nice Level */
  217.         break;
  218.     case 4: /* Other */
  219.         item = 0;
  220.         XtCallActionProc((Widget)w,"popup-settings",(XEvent*)NULL,
  221.                  (String*)NULL,item);
  222.         break;
  223.     }
  224. }
  225.  
  226. /*ARGSUSED*/
  227. static void
  228. hostMenuCallback(w,client_data,call_data)
  229. Widget w;
  230. XtPointer client_data;    /* item */
  231. XtPointer call_data;    /* ignored */
  232. {
  233.     int item = (int)client_data;
  234.     Arg args[1];
  235.     char *str,*blank,c;
  236.  
  237.     setIthItemMark(hostMenuItems,item,appResources.numHosts);
  238.     XtSetArg(args[0],XtNlabel,&str);
  239.     XtGetValues((Widget)(hostMenuItems[item]),args,1);
  240.     if ((blank=index(str,' ')) != NULL) {
  241.     c = *blank;
  242.     *blank = '\0';
  243.     }
  244.     XtFree(appResources.archieHost);
  245.     appResources.archieHost = XtNewString(str);
  246.     if (blank != NULL)
  247.     *blank = c;
  248.     updateSettingsHost(appResources.archieHost);
  249.     status1("Set archie host to %s",appResources.archieHost);
  250. }
  251.  
  252. /*ARGSUSED*/
  253. static void
  254. searchMenuCallback(w,client_data,call_data)
  255. Widget w;
  256. XtPointer client_data;    /* item */
  257. XtPointer call_data;    /* ignored */
  258. {
  259.     int item = (int)client_data;
  260.  
  261.     setIthItemMark(searchMenuItems,item,XtNumber(searchMenuItems));
  262.     appResources.searchType = searchValues[item];
  263.     updateSettingsSearchType(appResources.searchType);
  264.     status1("Set search type to %s",
  265.         searchTypeToString(appResources.searchType));
  266. }
  267.  
  268. /*ARGSUSED*/
  269. static void
  270. sortMenuCallback(w,client_data,call_data)
  271. Widget w;
  272. XtPointer client_data;    /* item */
  273. XtPointer call_data;    /* ignored */
  274. {
  275.     int item = (int)client_data;
  276.  
  277.     setIthItemMark(sortMenuItems,item,XtNumber(sortMenuItems));
  278.     appResources.sortType = sortValues[item];
  279.     updateSettingsSortType(appResources.sortType);
  280.     resortBrowser();
  281.     status1("Set sort type to %s",sortTypeToString(appResources.sortType));
  282. }
  283.  
  284. /*ARGSUSED*/
  285. static void
  286. niceMenuCallback(w,client_data,call_data)
  287. Widget w;
  288. XtPointer client_data;    /* item */
  289. XtPointer call_data;    /* ignored */
  290. {
  291.  
  292.     int item = (int)client_data;
  293.  
  294.     setIthItemMark(niceMenuItems,item,XtNumber(niceMenuItems));
  295.     appResources.niceLevel = niceValues[item];
  296.     updateSettingsNiceLevel(appResources.niceLevel);
  297.     status1("Set nice level to %d",(char *)appResources.niceLevel);
  298. }
  299.  
  300. /*ARGSUSED*/
  301. static void
  302. setHostMenuCallback(w,client_data,call_data)
  303. Widget w;
  304. XtPointer client_data;    /* item */
  305. XtPointer call_data;    /* ignored */
  306. {
  307.     int item = (int)client_data;
  308.     Arg args[1];
  309.     char *str,*blank,c;
  310.  
  311.     XtSetArg(args[0],XtNlabel,&str);
  312.     XtGetValues((Widget)(hostMenuItems[item]),args,1);
  313.     if ((blank=index(str,' ')) != NULL) {
  314.     c = *blank;
  315.     *blank = '\0';
  316.     }
  317.     updateSettingsHost(str);
  318.     if (blank != NULL)
  319.     *blank = c;
  320.     setSettingsChangedFlag(True);
  321. }
  322.  
  323. /*ARGSUSED*/
  324. static void
  325. setSearchMenuCallback(w,client_data,call_data)
  326. Widget w;
  327. XtPointer client_data;    /* item */
  328. XtPointer call_data;    /* ignored */
  329. {
  330.     int item = (int)client_data;
  331.  
  332.     updateSettingsSearchType(searchValues[item]);
  333.     setSettingsChangedFlag(True);
  334. }
  335.  
  336. /*ARGSUSED*/
  337. static void
  338. setSortMenuCallback(w,client_data,call_data)
  339. Widget w;
  340. XtPointer client_data;    /* item */
  341. XtPointer call_data;    /* ignored */
  342. {
  343.     int item = (int)client_data;
  344.  
  345.     updateSettingsSortType(sortValues[item]);
  346.     setSettingsChangedFlag(True);
  347. }
  348.  
  349. /*ARGSUSED*/
  350. static void
  351. setNiceMenuCallback(w,client_data,call_data)
  352. Widget w;
  353. XtPointer client_data;    /* item */
  354. XtPointer call_data;    /* ignored */
  355. {
  356.     int item = (int)client_data;
  357.  
  358.     updateSettingsNiceLevel(niceValues[item]);
  359.     setSettingsChangedFlag(True);
  360. }
  361.  
  362. /*ARGSUSED*/
  363. static void
  364. setAutoScrollMenuCallback(w,client_data,call_data)
  365. Widget w;
  366. XtPointer client_data;    /* item */
  367. XtPointer call_data;    /* ignored */
  368. {
  369.     int item = (int)client_data;
  370.  
  371.     updateSettingsAutoScroll(autoScrollValues[item]);
  372.     setSettingsChangedFlag(True);
  373. }
  374.  
  375. /*ARGSUSED*/
  376. static void
  377. ftpTypeMenuCallback(w,client_data,call_data)
  378. Widget w;
  379. XtPointer client_data;    /* item */
  380. XtPointer call_data;    /* ignored */
  381. {
  382.     int item = (int)client_data;
  383.  
  384.     updateSettingsFtpType(ftpTypeValues[item]);
  385.     setSettingsChangedFlag(True);
  386. }
  387.  
  388. /*ARGSUSED*/
  389. static void
  390. ftpPromptMenuCallback(w,client_data,call_data)
  391. Widget w;
  392. XtPointer client_data;    /* item */
  393. XtPointer call_data;    /* ignored */
  394. {
  395.     int item = (int)client_data;
  396.  
  397.     updateSettingsFtpPrompt(ftpPromptValues[item]);
  398.     setSettingsChangedFlag(True);
  399. }
  400.  
  401. /*ARGSUSED*/
  402. static void
  403. ftpTraceMenuCallback(w,client_data,call_data)
  404. Widget w;
  405. XtPointer client_data;    /* item */
  406. XtPointer call_data;    /* ignored */
  407. {
  408.     int item = (int)client_data;
  409.  
  410.     updateSettingsFtpTrace(ftpTraceValues[item]);
  411.     setSettingsChangedFlag(True);
  412. }
  413.  
  414. /*ARGSUSED*/
  415. static void
  416. ftpStripMenuCallback(w,client_data,call_data)
  417. Widget w;
  418. XtPointer client_data;    /* item */
  419. XtPointer call_data;    /* ignored */
  420. {
  421.     int item = (int)client_data;
  422.  
  423.     updateSettingsFtpStrip(ftpStripValues[item]);
  424.     setSettingsChangedFlag(True);
  425. }
  426.  
  427. /*    -    -    -    -    -    -    -    -    */
  428.  
  429. void
  430. updateSettingsMenuMarks()
  431. {
  432.     setHostMenuMark(appResources.archieHost);
  433.     setSearchMenuMark(appResources.searchType);
  434.     setSortMenuMark(appResources.sortType);
  435.     setNiceMenuMark(appResources.niceLevel);
  436. }
  437.  
  438. /*
  439.  * This function is more omcplicated than the others, since the value
  440.  * of the archieHost resource (that we're getting passed here as the "host"
  441.  * parameter) is a prefix of the corresponding menu label, since after
  442.  * whitespace there can be informative garbage in the menu item.
  443.  */
  444. void
  445. setHostMenuMark(host)
  446. char *host;
  447. {
  448.     Arg args[1];
  449.     char *str;
  450.     int i,l;
  451.  
  452.     l = strlen(host);
  453.     for (i=0; i < appResources.numHosts; i++) {
  454.     XtSetArg(args[0],XtNlabel,&str);
  455.     XtGetValues((Widget)(hostMenuItems[i]),args,1);
  456.     /* Given host must match the entire prefix up to whitespace (if any) */
  457.     if ((strlen(str) >= l) &&
  458.         (*(str+l) == '\0' || *(str+l) == ' ') &&
  459.         strncmp(str,host,l) == 0)
  460.         break;
  461.     }
  462.     if (i < appResources.numHosts)
  463.     setIthItemMark(hostMenuItems,i,appResources.numHosts);
  464.     else
  465.     clearAllItemMarks(hostMenuItems,appResources.numHosts);
  466. }
  467.  
  468. void
  469. setSearchMenuMark(type)
  470. SearchType type;
  471. {
  472.     int i;
  473.  
  474.     for (i=0; i < XtNumber(searchValues) && searchValues[i] != type; i++)
  475.     /*EMPTY*/;
  476.     if (i < XtNumber(searchValues))
  477.     setIthItemMark(searchMenuItems,i,XtNumber(searchMenuItems));
  478. }
  479.  
  480. void
  481. setSortMenuMark(type)
  482. SortType type;
  483. {
  484.     int i;
  485.  
  486.     for (i=0; i < XtNumber(sortValues) && sortValues[i] != type; i++)
  487.     /*EMPTY*/;
  488.     if (i < XtNumber(sortValues))
  489.     setIthItemMark(sortMenuItems,i,XtNumber(sortMenuItems));
  490. }
  491.  
  492. void
  493. setNiceMenuMark(level)
  494. int level;
  495. {
  496.     int i;
  497.  
  498.     for (i=0; i < XtNumber(niceValues) && niceValues[i] != level; i++)
  499.     /*EMPTY*/;
  500.     if (i < XtNumber(niceValues))
  501.     setIthItemMark(niceMenuItems,i,XtNumber(niceMenuItems));
  502.     else
  503.     clearAllItemMarks(niceMenuItems,XtNumber(niceMenuItems));
  504. }
  505.